//
//  XSQUserAccountViewModel.swift
//  WeiBo
//
//  Created by 许世强 on 2017/3/31.
//  Copyright © 2017年 许世强. All rights reserved.
//

import UIKit

//OAuth登录的相关接口的封装
class XSQUserAccountViewModel: NSObject {

    //创建用户信息模型属性
    var userAcount:XSQUserAccount?
    
    //创建单例的全局访问点
    static let shareViewModel:XSQUserAccountViewModel = XSQUserAccountViewModel()
    
    //重写init方法, 因为单例使用的时候小括弧会走init方法
    //私有化构造函数
    private override init(){
        super.init()
        
        //获取归档对象,给可选属性赋值
        userAcount = XSQUserAccount.loadUserAccount()
    }
    
    //封装获取access_token是否过期的逻辑
    var access_token:String?{
        
        //获取保存过期时间的对象
        if userAcount?.expriesDate?.compare(Date()) == ComparisonResult.orderedDescending {
            
            //如果保存过期时间的对象大于当前系统时间,表示没有过期
            return userAcount?.access_token
            
        }
        
        return nil
    }
    
    //封装是否登录的判断(令牌是否过期之后)
    var isLogin:Bool{
        
        return access_token != nil
    }

    
    //MARK: 01--通过code获取access_token和用户id
    //private表示只能在类内部使用.fileprivate表示也是私有的,但是可以在extension里面使用,但是都不能再外界访问这个方法
    func requestAccessToken(code:String, callBack:@escaping (Bool)->()){
        
        XSQNetWorkTools.sharedTools.requestAccessToken(code: code) { (response, error) in
            
            if error != nil{
                print("网络请求错误\(error)")
                callBack(false)
                return
            }
            
            //将服务端返回的数据转为字典  但是这里使用可选转(防止服务端的数据出现异常)
            //若是数组,[[String:Any]]
            guard  let dic = response as? [String:Any] else{
                
                print("服务端数据格式不对")
                callBack(false)
                return
            }
            
            //代码执行到此.表示response完成数据转字典/数组
            print(dic)
            let userAccount = XSQUserAccount.init(dic: dic)
            
            //通过uid和令牌获取用户信息,调用MARK02方法,传入userAccount模型
            self.requestUserInfo(userAccount:userAccount,callBack:callBack)
        }
        
    }
    
    //MARK: 02--通过令牌和用户id获取用户信息  (通过XSQUserAccount模型传入值)
    fileprivate func requestUserInfo(userAccount:XSQUserAccount, callBack:@escaping (Bool)->()){
        
        let access_token = userAccount.access_token
        
        let uid = userAccount.uid
        
        XSQNetWorkTools.sharedTools.requestUserInfo(access_token: access_token!, uid: uid) { (response, error) in
            
            if error != nil{
                print("网络请求错误\(error)")
                callBack(false)
                return
            }
            
            guard  let dic = response as? [String:Any] else{
                
                print("服务端数据格式不对")
                callBack(false)
                return
            }
            
            //代码执行到此,完成返回用户数据,可以查看打印的返回字段了
            print(dic)
            
            //将用户数据的name和头像地址取出  Any类型要转为stirng
            let name = dic["name"] as? String
            let avatar_large = dic["avatar_large"] as? String
            
            //给模型的两个用户属性赋值
            userAccount.name = name
            userAccount.avatar_large = avatar_large
            
            print(userAccount.name,userAccount.avatar_large)
            
            //保存用户对象(归档)
            userAccount.saveUserAccount()
            
            self.userAcount = userAccount
            
            //获取到用户信息,才表示登录成功了
            callBack(true)
        }
    }

}
